Skip to content

Sync/upstream release v2026.2.23#22

Merged
RedBeardEth merged 364 commits intomainfrom
sync/upstream-release-v2026.2.23
Feb 25, 2026
Merged

Sync/upstream release v2026.2.23#22
RedBeardEth merged 364 commits intomainfrom
sync/upstream-release-v2026.2.23

Conversation

@RedBeardEth
Copy link

Summary

Describe the problem and fix in 2–5 bullets:

  • Problem:
  • Why it matters:
  • What changed:
  • What did NOT change (scope boundary):

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • Integrations
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

  • Closes #
  • Related #

User-visible / Behavior Changes

List user-visible changes (including defaults/config).
If none, write None.

Security Impact (required)

  • New permissions/capabilities? (Yes/No)
  • Secrets/tokens handling changed? (Yes/No)
  • New/changed network calls? (Yes/No)
  • Command/tool execution surface changed? (Yes/No)
  • Data access scope changed? (Yes/No)
  • If any Yes, explain risk + mitigation:

Repro + Verification

Environment

  • OS:
  • Runtime/container:
  • Model/provider:
  • Integration/channel (if any):
  • Relevant config (redacted):

Steps

Expected

Actual

Evidence

Attach at least one:

  • Failing test/log before + passing after
  • Trace/log snippets
  • Screenshot/recording
  • Perf numbers (if relevant)

Human Verification (required)

What you personally verified (not just CI), and how:

  • Verified scenarios:
  • Edge cases checked:
  • What you did not verify:

Compatibility / Migration

  • Backward compatible? (Yes/No)
  • Config/env changes? (Yes/No)
  • Migration needed? (Yes/No)
  • If yes, exact upgrade steps:

Failure Recovery (if this breaks)

  • How to disable/revert this change quickly:
  • Files/config to restore:
  • Known bad symptoms reviewers should watch for:

Risks and Mitigations

List only real risks for this PR. Add/remove entries as needed. If none, write None.

  • Risk:
    • Mitigation:

steipete and others added 30 commits February 23, 2026 18:46
…enclaw#24696)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: d6d4b43
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
…rror

The generic "node command not allowed" error gives no indication of why the
command was rejected, making it hard to diagnose issues (e.g. running
`nodes notify` against a Linux node that does not declare `system.notify`).

Include the rejection reason and node platform in the error message so
callers can tell whether the command is not supported by the node, not in
the platform allowlist, or the node did not advertise its capabilities.

Fixes openclaw#24616

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit e3d7461)
…tension

The extension relay server authenticates using an HMAC-SHA256 derived
token (`openclaw-extension-relay-v1:<port>`), but the Chrome extension
was sending the raw gateway token. This caused both the WebSocket
connection and the options page validation to fail with 401 Unauthorized.

Additionally, the options page validation request triggered a CORS
preflight (due to the custom `x-openclaw-relay-token` header) which the
relay rejects because OPTIONS requests lack auth headers. The options
page now delegates the check to the background service worker which has
host_permissions and bypasses CORS preflight.

Fixes openclaw#23842

Co-authored-by: Cursor <cursoragent@cursor.com>
(cherry picked from commit bbc654b)
…penclaw#22327)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 2f02ec9
Co-authored-by: therk <901920+therk@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
Co-authored-by: Isis Anisoptera <github@lotuswind.net>
Co-authored-by: Lucian Feraru <1ucian@users.noreply.github.com>
Co-authored-by: aidiffuser <aidiffuser@users.noreply.github.com>
Co-authored-by: Axel Svensson <svenssonaxel@users.noreply.github.com>
Co-authored-by: avirweb <avirweb@users.noreply.github.com>
easternbloc and others added 28 commits February 24, 2026 04:33
…uncation

repairToolUseResultPairing was gated behind !isOpenAi, skipping orphaned
tool_result cleanup for OpenAI providers. When limitHistoryTurns truncated
conversation history, tool_result messages whose matching tool_call was
before the truncation point survived and were sent as function_call_output
items with stale call_id references. OpenAI rejects these with:
"No tool call found for function call output with call_id ..."

Enable the repair universally — all providers need it after truncation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 97b065a)
…penAI

The previous test asserted that OpenAI-responses sessions would NOT get
synthetic tool results for orphaned tool calls. With repairToolUseResultPairing
now running universally, the correct behavior is that orphaned tool calls
get a synthetic tool_result — matching what OpenAI actually requires.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
(cherry picked from commit 2edb0ff)
…odel

The 'auto' model on OpenRouter dynamically routes to any underlying model
OpenRouter selects, including reasoning-required endpoints. Previously,
OpenClaw would unconditionally inject `reasoning.effort: "none"` into
every request when the thinking level was "off", which causes a 400 error
on models where reasoning is mandatory and cannot be disabled.

Root cause:
- openrouter/auto has reasoning: false in the built-in catalog
- With thinking level "off", createOpenRouterWrapper injects
  `reasoning: { effort: "none" }` via mapThinkingLevelToOpenRouterReasoningEffort
- For any OpenRouter-routed model that requires reasoning this results in:
  "400 Reasoning is mandatory for this endpoint and cannot be disabled"
- The reasoning: false is then persisted back to models.json on every
  ensureOpenClawModelsJson call, so manually removing it has no lasting effect

Fix:
- In applyExtraParamsToAgent, when provider is "openrouter" and the model
  id is "auto", pass undefined as thinkingLevel to createOpenRouterWrapper
  so no reasoning.effort is injected at all, letting OpenRouter's upstream
  model handle it natively
- Add an explanatory comment in buildOpenrouterProvider clarifying that the
  reasoning: false catalog value does NOT cause effort injection for "auto"

Users who need explicit reasoning control should target a specific model
id (e.g. openrouter/deepseek/deepseek-r1) rather than the auto router.

Fixes openclaw#24851

(cherry picked from commit aa55439)
In trusted-proxy mode, sharedAuthResult is null because hasSharedAuth
only triggers for token/password in connectParams.auth. But the primary
auth (authResult) already validated the trusted-proxy — the connection
came from a CIDR in trustedProxies with a valid userHeader. This IS
shared auth semantically (the proxy vouches for identity), so operator
connections should be able to skip device identity.

Without this fix, trusted-proxy operator connections are rejected with
"device identity required" because roleCanSkipDeviceIdentity() sees
sharedAuthOk=false.

(cherry picked from commit e87048a)
When reasoningLevel is 'on', reasoning content was being sent as a
visible message to WhatsApp and other non-Telegram channels via two
paths:
1. Block reply: emitted via onBlockReply in handleMessageEnd
2. Final payloads: added to replyItems in buildEmbeddedRunPayloads

Telegram has its own dispatch path (bot-message-dispatch.ts) that
splits reasoning into a dedicated lane and handles suppression.
The generic dispatch-from-config.ts path used by WhatsApp, web, etc.
had no such filtering.

Fix:
- Add isReasoning?: boolean flag to ReplyPayload
- Tag reasoning payloads at both emission points
- Filter isReasoning payloads in dispatch-from-config.ts for both
  block reply and final reply paths

Telegram is unaffected: it uses its own deliver callback that detects
reasoning via the 'Reasoning:\n' prefix and routes to a separate lane.

Fixes openclaw#24954
When `includeReasoning` is active (or `reasoningLevel` falls back to the
model default), the agent emits reasoning blocks as separate reply
payloads prefixed with "Reasoning:\n".  Matrix has no dedicated reasoning
lane, so these internal thinking traces leak into the chat as regular
user-visible messages.

Filter out pure-reasoning payloads (those starting with "Reasoning:\n" or
a `<thinking>` tag) before delivery so internal reasoning never reaches
the Matrix room.

Fixes openclaw#24411

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Verify that deliverMatrixReplies skips replies whose text starts with
"Reasoning:\n" or opens with <thinking>/<think>/<antthinking> tags, while
still delivering all normal replies.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When streamMode is "partial", reasoning/thinking block content can leak
into the Discord draft preview because the partial text is forwarded to
the draft stream without filtering.  Apply `stripReasoningTagsFromText`
before updating the draft and skip pure-reasoning messages (those
starting with "Reasoning:\n") so internal thinking traces never reach
the user-visible preview.

Fixes openclaw#24532

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ream

Verify that partial stream updates containing <thinking> tags are stripped
before reaching the draft preview, and that pure "Reasoning:\n" partials
are suppressed entirely.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Attribution-only commit for the bot-authored upstream patch landed from openclaw#24705.
@coderabbitai
Copy link

coderabbitai bot commented Feb 24, 2026

Important

Review skipped

Too many files!

This PR contains 298 files, which is 148 over the limit of 150.

📥 Commits

Reviewing files that changed from the base of the PR and between 12afb1c and fc923e3.

⛔ Files ignored due to path filters (2)
  • docs/experiments/.DS_Store is excluded by !**/.DS_Store
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (298)
  • .github/workflows/ci.yml
  • .gitignore
  • .mailmap
  • .pre-commit-config.yaml
  • AGENTS.md
  • CHANGELOG.md
  • CONTRIBUTING.md
  • PR_STATUS.md
  • README.md
  • SECURITY.md
  • apps/android/app/build.gradle.kts
  • apps/ios/ShareExtension/Info.plist
  • apps/ios/Sources/Gateway/DeepLinkAgentPromptAlert.swift
  • apps/ios/Sources/Info.plist
  • apps/ios/Sources/Model/NodeAppModel.swift
  • apps/ios/Sources/RootCanvas.swift
  • apps/ios/Tests/Info.plist
  • apps/ios/Tests/NodeAppModelInvokeTests.swift
  • apps/ios/WatchApp/Info.plist
  • apps/ios/WatchExtension/Info.plist
  • apps/ios/project.yml
  • apps/macos/Sources/OpenClaw/Resources/Info.plist
  • apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
  • apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift
  • assets/chrome-extension/background-utils.js
  • assets/chrome-extension/background.js
  • assets/chrome-extension/options-validation.js
  • assets/chrome-extension/options.js
  • docs/automation/cron-jobs.md
  • docs/channels/discord.md
  • docs/channels/googlechat.md
  • docs/channels/irc.md
  • docs/channels/mattermost.md
  • docs/channels/msteams.md
  • docs/channels/slack.md
  • docs/cli/acp.md
  • docs/cli/cron.md
  • docs/cli/doctor.md
  • docs/cli/security.md
  • docs/cli/sessions.md
  • docs/concepts/model-providers.md
  • docs/concepts/session-pruning.md
  • docs/concepts/session-tool.md
  • docs/concepts/session.md
  • docs/design/kilo-gateway-integration.md
  • docs/docs.json
  • docs/gateway/configuration-examples.md
  • docs/gateway/configuration-reference.md
  • docs/gateway/configuration.md
  • docs/gateway/doctor.md
  • docs/gateway/protocol.md
  • docs/gateway/security/index.md
  • docs/gateway/trusted-proxy-auth.md
  • docs/help/faq.md
  • docs/install/development-channels.md
  • docs/install/hetzner.md
  • docs/platforms/mac/release.md
  • docs/plugins/voice-call.md
  • docs/providers/anthropic.md
  • docs/providers/kilocode.md
  • docs/providers/vercel-ai-gateway.md
  • docs/reference/prompt-caching.md
  • docs/reference/session-management-compaction.md
  • docs/reference/token-use.md
  • docs/tools/browser.md
  • docs/tools/chrome-extension.md
  • docs/tools/exec-approvals.md
  • docs/tools/exec.md
  • docs/tools/index.md
  • docs/tools/subagents.md
  • docs/tools/web.md
  • docs/vps.md
  • docs/web/control-ui.md
  • docs/web/index.md
  • docs/web/webchat.md
  • extensions/bluebubbles/package.json
  • extensions/bluebubbles/src/account-resolve.ts
  • extensions/bluebubbles/src/actions.test.ts
  • extensions/bluebubbles/src/actions.ts
  • extensions/bluebubbles/src/attachments.test.ts
  • extensions/bluebubbles/src/attachments.ts
  • extensions/bluebubbles/src/chat.test.ts
  • extensions/bluebubbles/src/config-schema.ts
  • extensions/bluebubbles/src/monitor-shared.ts
  • extensions/bluebubbles/src/onboarding.ts
  • extensions/bluebubbles/src/reactions.test.ts
  • extensions/bluebubbles/src/send.test.ts
  • extensions/bluebubbles/src/types.ts
  • extensions/copilot-proxy/package.json
  • extensions/device-pair/index.ts
  • extensions/diagnostics-otel/package.json
  • extensions/diagnostics-otel/src/service.test.ts
  • extensions/diagnostics-otel/src/service.ts
  • extensions/discord/package.json
  • extensions/discord/src/channel.ts
  • extensions/feishu/package.json
  • extensions/feishu/src/bot.ts
  • extensions/feishu/src/media.ts
  • extensions/feishu/src/send-target.ts
  • extensions/feishu/src/send.ts
  • extensions/feishu/src/streaming-card.ts
  • extensions/google-antigravity-auth/README.md
  • extensions/google-antigravity-auth/index.ts
  • extensions/google-antigravity-auth/openclaw.plugin.json
  • extensions/google-antigravity-auth/package.json
  • extensions/google-gemini-cli-auth/package.json
  • extensions/googlechat/package.json
  • extensions/googlechat/src/monitor.test.ts
  • extensions/googlechat/src/monitor.ts
  • extensions/imessage/package.json
  • extensions/irc/package.json
  • extensions/irc/src/channel.ts
  • extensions/irc/src/config-schema.ts
  • extensions/irc/src/inbound.ts
  • extensions/irc/src/monitor.ts
  • extensions/irc/src/normalize.test.ts
  • extensions/irc/src/normalize.ts
  • extensions/irc/src/policy.test.ts
  • extensions/irc/src/policy.ts
  • extensions/irc/src/types.ts
  • extensions/line/package.json
  • extensions/line/src/channel.logout.test.ts
  • extensions/line/src/channel.startup.test.ts
  • extensions/line/src/channel.ts
  • extensions/llm-task/package.json
  • extensions/llm-task/src/llm-task-tool.ts
  • extensions/lobster/package.json
  • extensions/lobster/src/lobster-tool.test.ts
  • extensions/lobster/src/test-helpers.ts
  • extensions/lobster/src/windows-spawn.test.ts
  • extensions/matrix/package.json
  • extensions/matrix/src/matrix/deps.ts
  • extensions/matrix/src/matrix/monitor/index.ts
  • extensions/matrix/src/matrix/monitor/replies.test.ts
  • extensions/matrix/src/matrix/monitor/replies.ts
  • extensions/mattermost/package.json
  • extensions/mattermost/src/config-schema.ts
  • extensions/mattermost/src/mattermost/monitor-helpers.ts
  • extensions/mattermost/src/mattermost/monitor.ts
  • extensions/mattermost/src/types.ts
  • extensions/memory-core/package.json
  • extensions/memory-lancedb/package.json
  • extensions/minimax-portal-auth/package.json
  • extensions/msteams/package.json
  • extensions/msteams/src/attachments.test.ts
  • extensions/msteams/src/attachments/payload.ts
  • extensions/msteams/src/messenger.test.ts
  • extensions/msteams/src/monitor-handler/message-handler.ts
  • extensions/msteams/src/policy.test.ts
  • extensions/msteams/src/policy.ts
  • extensions/nextcloud-talk/package.json
  • extensions/nextcloud-talk/src/config-schema.ts
  • extensions/nextcloud-talk/src/inbound.ts
  • extensions/nextcloud-talk/src/monitor.ts
  • extensions/nostr/package.json
  • extensions/nostr/src/nostr-profile-http.test.ts
  • extensions/open-prose/package.json
  • extensions/signal/package.json
  • extensions/signal/src/channel.ts
  • extensions/slack/package.json
  • extensions/synology-chat/package.json
  • extensions/synology-chat/src/channel.test.ts
  • extensions/synology-chat/src/channel.ts
  • extensions/synology-chat/src/client.test.ts
  • extensions/synology-chat/src/webhook-handler.test.ts
  • extensions/telegram/package.json
  • extensions/telegram/src/channel.test.ts
  • extensions/telegram/src/channel.ts
  • extensions/test-utils/runtime-env.ts
  • extensions/tlon/package.json
  • extensions/tlon/src/config-schema.ts
  • extensions/tlon/src/monitor/index.ts
  • extensions/twitch/package.json
  • extensions/twitch/src/access-control.test.ts
  • extensions/voice-call/README.md
  • extensions/voice-call/package.json
  • extensions/voice-call/src/cli.ts
  • extensions/voice-call/src/manager.test.ts
  • extensions/voice-call/src/manager/context.ts
  • extensions/voice-call/src/manager/events.test.ts
  • extensions/voice-call/src/manager/events.ts
  • extensions/voice-call/src/manager/outbound.ts
  • extensions/voice-call/src/manager/timers.ts
  • extensions/voice-call/src/providers/plivo.ts
  • extensions/voice-call/src/providers/twilio.test.ts
  • extensions/voice-call/src/providers/twilio.ts
  • extensions/voice-call/src/providers/twilio/webhook.ts
  • extensions/voice-call/src/types.ts
  • extensions/voice-call/src/webhook-security.test.ts
  • extensions/voice-call/src/webhook-security.ts
  • extensions/voice-call/src/webhook.test.ts
  • extensions/voice-call/src/webhook.ts
  • extensions/whatsapp/package.json
  • extensions/whatsapp/src/channel.ts
  • extensions/whatsapp/src/resolve-target.test.ts
  • extensions/zalo/package.json
  • extensions/zalo/src/actions.ts
  • extensions/zalo/src/channel.ts
  • extensions/zalo/src/monitor.ts
  • extensions/zalouser/package.json
  • extensions/zalouser/src/monitor.ts
  • package.json
  • pyproject.toml
  • scripts/make_appcast.sh
  • scripts/release-check.ts
  • scripts/test-parallel.mjs
  • scripts/update-clawtributors.ts
  • skills/model-usage/scripts/model_usage.py
  • skills/model-usage/scripts/test_model_usage.py
  • skills/nano-banana-pro/scripts/generate_image.py
  • skills/openai-image-gen/scripts/gen.py
  • skills/openai-image-gen/scripts/test_gen.py
  • skills/skill-creator/scripts/package_skill.py
  • skills/skill-creator/scripts/quick_validate.py
  • skills/skill-creator/scripts/test_package_skill.py
  • skills/skill-creator/scripts/test_quick_validate.py
  • src/acp/client.test.ts
  • src/acp/client.ts
  • src/acp/translator.prompt-prefix.test.ts
  • src/acp/translator.session-rate-limit.test.ts
  • src/acp/translator.test-helpers.ts
  • src/agents/agent-scope.test.ts
  • src/agents/agent-scope.ts
  • src/agents/apply-patch.ts
  • src/agents/auth-profiles/oauth.ts
  • src/agents/bash-tools.exec-approval-request.test.ts
  • src/agents/bash-tools.exec-approval-request.ts
  • src/agents/bash-tools.exec-host-gateway.ts
  • src/agents/bash-tools.exec-host-node.ts
  • src/agents/bash-tools.exec-runtime.ts
  • src/agents/bash-tools.exec.approval-id.test.ts
  • src/agents/bash-tools.exec.background-abort.test.ts
  • src/agents/bash-tools.exec.path.test.ts
  • src/agents/bash-tools.process.poll-timeout.test.ts
  • src/agents/bash-tools.process.send-keys.test.ts
  • src/agents/bash-tools.process.ts
  • src/agents/bash-tools.test.ts
  • src/agents/bootstrap-cache.test.ts
  • src/agents/bootstrap-cache.ts
  • src/agents/bootstrap-files.ts
  • src/agents/context.test.ts
  • src/agents/context.ts
  • src/agents/failover-error.test.ts
  • src/agents/failover-error.ts
  • src/agents/live-auth-keys.test.ts
  • src/agents/live-model-filter.test.ts
  • src/agents/live-model-filter.ts
  • src/agents/model-auth.profiles.test.ts
  • src/agents/model-auth.ts
  • src/agents/model-catalog.recovery.test.ts
  • src/agents/model-catalog.test.ts
  • src/agents/model-catalog.ts
  • src/agents/model-compat.test.ts
  • src/agents/model-compat.ts
  • src/agents/model-fallback.test.ts
  • src/agents/model-fallback.ts
  • src/agents/model-forward-compat.antigravity-gemini31.test.ts
  • src/agents/model-forward-compat.test.ts
  • src/agents/model-forward-compat.ts
  • src/agents/model-selection.test.ts
  • src/agents/model-selection.ts
  • src/agents/models-config.fills-missing-provider-apikey-from-env-var.test.ts
  • src/agents/models-config.normalizes-gemini-3-ids-preview-google-providers.test.ts
  • src/agents/models-config.providers.kilocode.test.ts
  • src/agents/models-config.providers.ts
  • src/agents/models-config.test-utils.ts
  • src/agents/models-config.ts
  • src/agents/moonshot.live.test.ts
  • src/agents/ollama-stream.test.ts
  • src/agents/openclaw-tools.camera.test.ts
  • src/agents/openclaw-tools.subagents.sessions-spawn-default-timeout-absent.test.ts
  • src/agents/openclaw-tools.subagents.sessions-spawn-default-timeout.test.ts
  • src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts
  • src/agents/openclaw-tools.subagents.sessions-spawn.test-harness.ts
  • src/agents/openclaw-tools.ts
  • src/agents/pi-embedded-helpers.formatassistanterrortext.test.ts
  • src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts
  • src/agents/pi-embedded-helpers/errors.ts
  • src/agents/pi-embedded-helpers/google.ts
  • src/agents/pi-embedded-payloads.ts
  • src/agents/pi-embedded-runner-extraparams.test.ts
  • src/agents/pi-embedded-runner.google-sanitize-thinking.test.ts
  • src/agents/pi-embedded-runner.sanitize-session-history.test.ts
  • src/agents/pi-embedded-runner.test.ts
  • src/agents/pi-embedded-runner/cache-ttl.test.ts
  • src/agents/pi-embedded-runner/cache-ttl.ts
  • src/agents/pi-embedded-runner/extensions.ts
  • src/agents/pi-embedded-runner/extra-params.ts
  • src/agents/pi-embedded-runner/google.test.ts
  • src/agents/pi-embedded-runner/google.ts
  • src/agents/pi-embedded-runner/kilocode.test.ts
  • src/agents/pi-embedded-runner/model.test.ts
  • src/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.ts
  • src/agents/pi-embedded-runner/run.ts
  • src/agents/pi-embedded-runner/run/attempt.test.ts
  • src/agents/pi-embedded-runner/run/attempt.ts
  • src/agents/pi-embedded-runner/run/params.ts
  • src/agents/pi-embedded-runner/run/payloads.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch sync/upstream-release-v2026.2.23

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@RedBeardEth RedBeardEth merged commit cb723a5 into main Feb 25, 2026
3 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.